package com.ruoyi.system.domain;

import com.ruoyi.common.domain.BaseEntity;
import org.babyfish.jimmer.Formula;
import org.babyfish.jimmer.sql.*;
import org.springframework.lang.Nullable;

import java.util.List;
import java.util.Objects;

import static com.ruoyi.common.core.constant.ServiceNameConstants.SYSTEM_SERVICE;

/**
 * 部门表 sys_dept
 *
 * @author ruoyi
 */
@Entity(microServiceName = SYSTEM_SERVICE)
@Table(name = "sys_dept")
public interface SysDept extends BaseEntity {

    /**
     * 部门ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    long deptId();

    /**
     * 父部门ID
     */
    @IdView
    Long parentId();

    /**
     * 祖级列表
     */
    String ancestors();

    /**
     * 部门名称
     */
    String deptName();

    /**
     * 显示顺序
     */
    Integer orderNum();

    /**
     * 负责人
     */
    @Nullable
    String leader();

    /**
     * 联系电话
     */
    @Nullable
    String phone();

    /**
     * 邮箱
     */
    @Nullable
    String email();
    /**
     * 部门状态:0正常,1停用
     */
    String status();

    /**
     * 删除标志（0代表存在 2代表删除）
     */
    @Default("0")
    @LogicalDeleted("2")
    int delFlag();


    /**
     * 子部门
     */
    @OneToMany(mappedBy = "parent")
    List<SysDept> children();

    /**
     * 上级组织
     */
    @Nullable
    @ManyToOne
    @OnDissociate(DissociateAction.DELETE)
    SysDept parent();

    @ManyToMany(mappedBy = "depts")
    List<SysRole> roles();

    @OneToMany(mappedBy = "dept")
    List<SysUser> users();

    @Formula(dependencies = {"status"})
    default boolean disabled() {
        return Objects.equals(this.status(), "1");
    }

    /**
     * 创建者
     */
    @Nullable
    @ManyToOne
    @OnDissociate(DissociateAction.SET_NULL)
    @JoinColumn(name = "create_by")
    SysUser createBy();

    /**
     * 更新者
     */
    @Nullable
    @ManyToOne
    @OnDissociate(DissociateAction.SET_NULL)
    @JoinColumn(name = "update_by")
    SysUser updateBy();
}
